package com.gec.anan.rules.utils;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;

/**
 * 定义一个Drools帮助类，接收规则字符串（规则文件的文本内容），返回KieSession
 * DroolsHelper
 */

public class DroolsHelper {

    public static KieSession loadForRule(String drlStr) {
        KieServices kieServices = KieServices.Factory.get();

        /**
         * KieFileSystem 类在 Drools（一个开源业务规则管理系统）中扮演着至关重要的角色。
         *
         * 主要功能：
         * 添加源文件：KieFileSystem 提供了 write() 和 writeAll() 等方法来添加源文件，例如 DRL 文件或 Java 类文件。
         * 删除源文件：KieFileSystem 提供了 delete() 和 deleteAll() 等方法来删除源文件。
         * 修改源文件：KieFileSystem 提供了 replace() 和 replaceAll() 等方法来修改源文件。
         * 生成 Kie 模块：KieFileSystem 提供了 build() 和 writeKieModule() 方法来生成 Kie 模块，其中包含编译后的规则、流程和其他业务逻辑定义。
         * 获取 Kie 模块：KieFileSystem 提供了 getKieModule() 方法来获取生成的 Kie 模块。
         */

        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        // ResourceFactory 是一个工厂类，用于创建 Drools 资源。
        // newClassPathResource() 方法用于从类路径中加载资源文件（如 .drl 文件）。
        //解析参数：
        //drlStr：这个参数是一个字符串，表示 .drl 文件在类路径中的位置。
        // 例如，drlStr 可能是 "rules/sample.drl"，表示这个文件位于 src/main/resources/rules/sample.drl 中。
        kieFileSystem.write(
                ResourceFactory.newClassPathResource(drlStr));

        KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
        kb.buildAll();

        KieModule kieModule = kb.getKieModule();
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        return kieContainer.newKieSession();
    }
}
